;*********************************************************** ; A/D変換動作チェックプログラム(2) ; スリープ機能使用(A/D 割り込み使用) ; A/D変換入力端子(CH0/RA0) ; A/D変換の結果はLED点灯により確認 ; RB1(MSB),RB0,RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0(LSB) ; の10ビット ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ ORG 0 ; プログラムの開始番地の指定 ;*********************************************************** ; 入出力ピン初期化と割り込み設定 ;*********************************************************** INIT BSF STATUS,RP0 ; Bank 1 へ切替 MOVLW B'10001110' ; RA0のみアナログ、結果右詰 MOVWF ADCON1 ; ADCON1レジスタの設定 BSF PIE1,ADIE ; A/D 割り込みを発生可にする CLRF TRISB ; PortB 出力モードに設定 CLRF TRISD ; PortD 出力モードに設定 BCF STATUS,RP0 ; Bank 0 へ戻す ; MOVLW B'11000001' ; Frc,CH0 設定, A/Don MOVWF ADCON0 ; ADCON0レジスタの設定 BSF INTCON,PEIE ; 周辺割り込みを発生させる ;*********************************************************** ; メインプログラム ;*********************************************************** ADSTART BCF PIR1,ADIF ; A/D 割り込みフラグビットをクリアする CALL TIME ; 23.2μs 一定時間待つ ; (2TAD [2×1.6μs]+アクィジション時間[20μs]) BSF ADCON0,GO ; A/D スタート SLEEP ; SLEEP 命令を実行 ; MOVF ADRESH,W ; A/D データ上位(データは右詰) MOVWF PORTB ; PortBへ A/D 結果を出力 BSF STATUS,RP0 ; Bank 1 へ切替 MOVF ADRESL,W ; A/D データ下位 BCF STATUS,RP0 ; Bank 0 へ戻す MOVWF PORTD ; PortDへ A/D 結果を出力 GOTO ADSTART ; A/D 変換を繰り返す ;*********************************************************** ;23μs遅延サブルーチン(20MHzクロック時) ;*********************************************************** TIME MOVLW 25H ; 1サイクル 25H = 37 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(37-1)+2 = 38サイクル GOTO LOOP ; 2×(37-1) = 72サイクル RETURN ; 2サイクル ; 合計 115サイクル×0.2μs = 23μs INTR END